package com.itmake.sample.easyexcel.util;

import com.alibaba.excel.EasyExcelFactory;
import com.itmake.sample.easyexcel.constant.ExcelConstant;
import javax.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * excel 操作工具
 *
 * @param <T>
 * @author Amjacks
 * @since 2023/08/10
 */
public class ExcelUtil<T> {

    /**
     * 实体对象
     */
    public final Class<T> clazz;

    public ExcelUtil(Class<T> clazz) {
        this.clazz = clazz;
    }

    /**
     * 导入 excel 为 list
     *
     * @param is 输入流
     * @return 转换后集合
     */
    public List<T> importExcel(InputStream is) {
        return EasyExcelFactory.read(is).head(clazz).sheet().doReadSync();
    }

    /**
     * 导出 list 为 excel
     *
     * @param list 导出数据集合
     * @param sheetName 工作表的名称
     * @param outputStream 输出流
     */
    public void exportExcel(List<T> list, String sheetName, OutputStream outputStream) {
        EasyExcelFactory.write(outputStream, clazz).sheet(sheetName).doWrite(list);
    }

    /**
     * 导出 list 为 excel
     *
     * @param list 导出数据集合
     * @param name 文件名
     * @param response 响应
     */
    public void exportExcel(List<T> list, String name, HttpServletResponse response) throws IOException {
        // 当前时间
        SimpleDateFormat formatter = new SimpleDateFormat(ExcelConstant.TIME_FORMAT);
        String currentTime = formatter.format(new Date());
        // 生成新的文件名
        String fileName = name + ExcelConstant.SEPARATOR + currentTime + ExcelConstant.EXTENSION;
        // 设置文件名 header
        response.addHeader(ExcelConstant.RESPONSE_HEADER, URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()));
        // 导出
        EasyExcelFactory.write(response.getOutputStream(), clazz).sheet(name).doWrite(list);
    }
}
